Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Tree of nested sets - определение кол-ва затронутых записей до выполнения sql-запроса (Rin)
Author Message
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 185
   поощрить/наказать

Location: Москва

PostPosted: Thu Oct 11, 2007 5:58 pm (написано за 19 секунд)
   Post subject: Tree of nested sets - определение кол-ва затронутых записей до выполнения sql-запроса
Reply with quote

Вопрос по деревьям модели вложенных множеств.
Как известно, перед вставкой записи в дерево (запросом INSERT) необходимо сделать смещение левого или правого поддерева.
Для вставки записи в конец списка дочерних узлов запросы будут следующими:
Code (SQL): скопировать код в буфер обмена
-- справа:
UPDATE ?#:table
   SET ns_left  = IF (ns_left > ?i:ns_left, ns_left + ?i:delta, ns_left),
       ns_right = ns_right + ?i:delta
WHERE ns_right >= ?i:ns_right;

-- слева:
UPDATE ?#:table
   SET ns_right = IF (ns_right < ?i:ns_right, ns_right - ?i:delta, ns_right),
       ns_left  = ns_left - ?i:delta
 WHERE ns_left < ?i:ns_right;
?#:table -- название таблицы дерева
?i:ns_left, ?i:ns_right -- числовые значения родительского узла
?i:delta -- значение равно 2.

Возможно ли определить кол-во затронутых записей (~ формулы для 2-х случаев: слева и справа), которые будут обновлены ДО выполнения запроса UPDATE в БД? Было бы неплохо добавить LIMIT в sql запросы а так же принимать решение для выбора правого или левого обновления.
Back to top
View user's profile Send private message Send e-mail
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Thu Oct 11, 2007 11:42 pm (спустя 5 часов 43 минуты; написано за 51 секунду)
   Post subject:
Reply with quote


М

Rin, уберите рекламу из своей подписи.
Back to top
View user's profile Send private message
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 185
   поощрить/наказать

Location: Москва

PostPosted: Fri Oct 12, 2007 10:46 am (спустя 11 часов 3 минуты; написано за 25 секунд)
   Post subject:
Reply with quote

Убрал, хотя правила форума я не нарушал.
Back to top
View user's profile Send private message Send e-mail
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 185
   поощрить/наказать

Location: Москва

PostPosted: Sun Oct 14, 2007 8:44 pm (спустя 2 дня 9 часов 58 минут; написано за 2 минуты 9 секунд)
   Post subject:
Reply with quote

Видимо, без SQL запроса не обойтись, вот решение для принятия левостороннего или правостороннего обновления.
Функциональность используется в классе TreeNS (forum.dklab.ru/viewtopic.php?t=27484).
Code (SQL): скопировать код в буфер обмена
--
SELECT IF (?i:ns_right - MIN(ns_left) < MAX(ns_right) - ?i:ns_right, "left", "right") AS method
  FROM ?#:table
--
SELECT IF (?i:ns_left - MIN(ns_left) < MAX(ns_right) - ?i:ns_right, "left", "right") AS method
  FROM ?#:table
 
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML